package org.smartjava.concurrent.juc.queue;

import org.smartjava.util.PrintUtil;
import org.smartjava.util.ThreadUtil;

import java.time.LocalTime;
import java.util.concurrent.ArrayBlockingQueue;

//　　add         增加一个元索                如果队列已满，则抛出一个IIIegaISlabEepeplian异常
//　　remove      移除并返回队列头部的元素      如果队列为空，则抛出一个NoSuchElementException异常
//　　element     返回队列头部的元素           如果队列为空，则抛出一个NoSuchElementException异常
//　　offer       添加一个元素并返回true       如果队列已满，则返回false
//　　poll        移除并返问队列头部的元素      如果队列为空，则返回null
//　　peek        返回队列头部的元素           如果队列为空，则返回null
//　　put         添加一个元素                如果队列满，则阻塞
//　　take        移除并返回队列头部的元素      如果队列为空，则阻塞
public class QueueExample {

    public static void main(String[] args) {
        blockWaitPut();
    }

    public static void blockWaitPut() {
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
        int num = 7;
        new Thread(() -> {

            for (int i = 0; i < num; i++) {
                ThreadUtil.sleep(1);
                try {
                    String element = "Element" + i;
                    queue.put(element);
                    PrintUtil.print(LocalTime.now(), "-", ThreadUtil.threadName(), " put:", element, " remain:", queue);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "[Put ]").start();

        new Thread(() -> {
            for (int i = 0; i < num; i++) {
                ThreadUtil.sleep(2);
                try {
                    String take = queue.take();
                    PrintUtil.print(LocalTime.now(), "-", ThreadUtil.threadName(), "take:", take, " remain:", queue);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "[Take]").start();
    }
}
